#ifndef _LINK_H
#include <stdbool.h>

typedef int ElementType;

typedef struct node{
    ElementType data;
    struct node *next;
}Node;

typedef struct link{
    Node *head;
    int size;
}Link;

//初始化链表
void init(Link *plink);

// 检测链表是否为空
bool is_empty(Link *plink);

// 得到链表中的数据节点个数(表长)
int LengthList(Link *plink);

// 在链表中插入一个链节。成功返回1，失败返回0
int insert(Link *plink, ElementType element, int index);

// 在链表的尾部添加一个链节
void add(Link *plink, ElementType element);

// 删除索引处的前一个的链节
int delete_link(Link *plink, int index);

// 返回索引处的链节的前一个链节
Node *find(Link *plink, int index);

// 清空链节
void make_empty(Link *plink);

// 归并两个升序的单链表,成功返回1，失败返回0
int MergeList(Link *la, Link *lb, Link *lc);

// 显示链表数据
void display(Link *plink);

// 翻转节点pp之后的节点，原地逆置，成功返回1，失败返回0
int RverseList(Node *pp);

// 找出带头结点的单链表倒数第k(k>0)个结点。
Node *FindKNode(Link *LL,unsigned int kk);

// 反向打印链表中的节点信息（从后往前）
void PrintfNode(Node *pp);

// 判断单链表是否有环，并找到环的入口。
Node *FindLoop(Link *LL);

// 找出两个汇聚单链表的公共结点，如果没有汇聚，返回空，如果有，返回汇聚的第一个结点。
Node *FindJoin(Link *La,Link *Lb);

// 假设线性表L=(a1,a2,a3,...,an-2,an-1,an)采用带头结点的单链表保存，数据结点的个数为偶数。
// 请设计一个空间复杂度为O(1)且时间上尽可能高效的算法，重新排列L中的各结点。
// 最后得到线性表L=(a1,an,a2,an-1,a3,an-2,...)。
void ReplaceList(Link *LL);

#endif